package com.jwater.core.net;

import java.io.InputStream;
import java.util.List;

import com.jwater.core.common.IpPort;
import com.jwater.core.net.NodeHandler.Callback;

/**
 * @description:
 * @author: jnner
 * @createDate: 2021/2/5
 * @version: 1.0
 */
public interface Node {
    /**
     * 重复建立连接的间隔
     *
     * @param connectInterval
     */
    public void setConnectInterval(int connectInterval);

    /**
     * 是否自动重连
     *
     * @param autoConnect
     */
    public void setAutoConnect(boolean autoConnect);

    /**
     * 建立连接次数限制
     *
     * @param connectLimit
     */
    public void setConnectLimit(int connectLimit);

    /**
     * 设置node处理器
     *
     * @param handler
     */
    public void setHandler(NodeHandler handler);

    /**
     * 设置文件处理器
     *
     * @param fileHandler
     */
    public void setFileHandler(FileHandler fileHandler);

    /**
     * 获取ID
     *
     * @return
     */
    public String getNodeId();

    /**
     * 是否连接
     *
     * @return
     */
    public boolean isConnect();

    /**
     * 获取建立连接的次数
     *
     * @return
     */
    public int getConnectCount();

    /**
     * 作为服务器启动
     *
     * @param port
     */
    public void startAsServer(int port);

    /**
     * 作为客户端启动
     *
     * @param ip
     * @param port
     * @param async
     */
    public void startAsClient(String ip, int port, boolean async);

    /**
     * 作为客户端启动
     *
     * @param hosts
     * @param async
     */
    public void startAsClient(List<IpPort> hosts, boolean async);

    /**
     * 关闭
     */
    public void close();

    /**
     * 发送数据
     *
     * @param dataType
     * @param data
     */
    public void sendData(String dataType, byte[] data);

    /**
     * 发送文件
     *
     * @param category
     * @param fileName
     * @param fis
     */
    public void sendFile(String category, String fileName, InputStream fis);

    /**
     * 发送文件出错消息
     *
     * @param category
     * @param fileName
     * @param errorMsg
     */
    public void sendFileError(String category, String fileName, String errorMsg);

    /**
     * 同步调用
     *
     * @param method
     * @param args
     * @param timeout
     * @return
     */
    public byte[] syncCall(String method, byte[] args, long timeout);

    /**
     * 同步调用
     *
     * @param method
     * @param args
     * @return
     */
    public byte[] syncCall(String method, byte[] args);

    /**
     * 异步调用
     *
     * @param method
     * @param args
     * @param callback
     */
    public void asyncCall(String method, byte[] args, Callback callback);

    /**
     * 获取代理对象
     *
     * @param clazz
     * @param <T>
     * @return
     */
    public <T> T getProxy(Class<?> clazz);

    /**
     * 获取代理对象
     *
     * @param clazz
     * @param timeout
     * @param <T>
     * @return
     */
    public <T> T getProxy(Class<?> clazz, long timeout);

    /**
     * 设置属性
     *
     * @param key
     * @param value
     */
    public void setAttribute(String key, Object value);

    /**
     * 获取属性
     *
     * @param key
     * @return
     */
    public Object getAttribute(String key);

    /**
     * 移除属性
     *
     * @param key
     */
    public void removeAttribute(String key);
}
